/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.isd.pool.web;

import com.isd.global.util.JsfUtil;
import com.isd.inventario.modelo.Producto;
import com.isd.pool.modelo.ItemPicking;
import com.isd.pool.modelo.ItemProductoPool;
import com.isd.pool.modelo.Pool;
import com.isd.pool.rn.PoolRN;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

/**
 *
 * @author Claudio
 */
@ManagedBean
@SessionScoped
public class PickingBean {
    
    @EJB private PoolRN poolRN;
    
    private Pool pool;
    private ItemPicking itemPicking;    
    private List<Producto> productos;
        
    @ManagedProperty(value = "#{poolAplicacionBean}")
    private PoolAplicacionBean poolAplicacionBean;
    

    /**
     * Creates a new instance of PickingBean
     */
    public PickingBean() {
        
    }
    
    @PostConstruct
    public void init(){
        productos = new ArrayList<Producto>();
    }
    
    public void seleccionarPool(Pool p){

        pool = p;        
        itemPicking = new ItemPicking();
        
        sincronizarProductos();
        
    }   
    
    public void sincronizarProductos(){
        
        if(pool==null) return;
        
        productos.clear();        
        for(ItemProductoPool ipp: pool.getProductos()){
            
            if(ipp.getProducto()!=null){                
                productos.add(ipp.getProducto());                                
            }            
        }        
        
        //if(productos.size()==1){
        //    itemPicking.setProducto(productos.get(0));
        //}
        
    }
    
    public void agregarItemPicking(){

        try {
            
            pool = poolRN.getPool(pool.getNroPool());
            sincronizarProductos();
            sincronizarCantidadMaxima();
            
            if(pool==null) return;
            
            if(itemPicking==null) return;
            
            //System.err.println("Cantidad:" + itemPicking.getCantid() );
            //System.err.println("Cantidad max:" + itemPicking.getCantidadMaxima());
            
            if(itemPicking.getCantid()<=0) {                
                JsfUtil.addErrorMessage("Ingrese un valor para cantidad mayor a cero");
                return;
            }
            
            if(itemPicking.getCantidadMaxima()<=0) {                
                JsfUtil.addErrorMessage("No existe cantidad disponible a picar");
                return;
            }
            
            if(itemPicking.getCantidadMaxima()>0 && itemPicking.getCantid()>itemPicking.getCantidadMaxima()) {                
                JsfUtil.addErrorMessage("No hay cantidad disponible suficiente para el picking. Ingrese un valor menor a " + itemPicking.getCantidadMaxima());
                return;
            }
            
            itemPicking.setNrpool(pool.getNroPool());
            itemPicking.setNorden(pool.getItemsPicking().size()+1);         
            itemPicking.setPool(pool);            
            itemPicking.setFecalt(new Date());
            pool.getItemsPicking().add(0,itemPicking);                      
            
            itemPicking = new ItemPicking();
            
            guardar();
            JsfUtil.addInfoMessage("El item fue agregado");

        } catch (Exception ex) {
            JsfUtil.addErrorMessage("No es posible agregar el item");
            JsfUtil.addErrorMessage(ex.getMessage());
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "agregarItemPicking", ex);    
        }
    }
    
    public void sincronizarCantidadMaxima(){
        
        //pool = poolRN.getPool(pool.getNroPool());
        
        for(ItemProductoPool ipp: pool.getProductos()){
            
            if(ipp.getProducto().getCodigo().equals(itemPicking.getProducto().getCodigo())){
                
                itemPicking.setCantidadMaxima(ipp.getCantidadDisponible().intValue());                
            }            
        }  
        
        //System.err.println("Seleccionando producto" + itemPicking.getProducto());
        //System.err.println("Seleccionado cantidad maxima: " + itemPicking.getCantidadMaxima());
    }

    public void eliminarItemPicking(ItemPicking item){

        item.setDebaja("S");
        item.setFecmod(new Date());
        guardar();

    }
    
    public void guardar(){

        try {
            poolRN.guardar(pool);
            poolAplicacionBean.sincronizarCantidades(pool);
            poolRN.guardar(pool);
            poolAplicacionBean.actualizarDatos();
            seleccionarPool(pool);
            JsfUtil.addInfoMessage("Los datos se actualizaron corecctamente");
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "guardar", e);    
            JsfUtil.addErrorMessage("No es posible guardar los datos "+ e.getMessage());
        }
    }

    public Pool getPool() {
        return pool;
    }

    public void setPool(Pool pool) {
        this.pool = pool;
    }

    public ItemPicking getItemPicking() {
        return itemPicking;
    }

    public void setItemPicking(ItemPicking itemPicking) {
        this.itemPicking = itemPicking;
    }

    public PoolAplicacionBean getPoolAplicacionBean() {
        return poolAplicacionBean;
    }

    public void setPoolAplicacionBean(PoolAplicacionBean poolAplicacionBean) {
        this.poolAplicacionBean = poolAplicacionBean;
    }  

    public List<Producto> getProductos() {
        return productos;
    }

    public void setProductos(List<Producto> productos) {
        this.productos = productos;
    }
    
}
